﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LOGIC
{
    /// Logisk klass för hantering av utrustningsuthyrning
    public class LogicRental
    {
        private DB.Faktura invoice;
        private DB.Uthyrning rental;
        private DB.UthyrningsRad rentalRow;

        public LogicRental()
        {
        }

        private LogicRental(DB.Uthyrning rentObject)
        {
            this.rental = rentObject;
        }
        private LogicRental(DB.UthyrningsRad rentRowObject)
        {
            this.rentalRow = rentRowObject;
        }

        private LogicSession session;
        public LogicRental(LogicSession session)
        {
            this.session = session;
        }
        
        /// Get Metoder
        #region
        
        public int GetRentalId
        {
            get { return rental.uthyrningsNr; }
        }

        public string GetName
        {
            get { return rental.namn; }
        }

        public string GetAddress
        {
            get { return rental.gatuadress; }
        }

        public string GetZip
        {
            get { return rental.postNr; }
        }

        public string GetCity
        {
            get { return rental.ort; }
        }

        public int GetStaffId
        {
            get { return (int)rental.personalID; }
        }

        public int GetOrgNr
        {
            get { return (int)rental.gästNr; }
        }
        
        public DateTime GetRentalEndDate
        {
            get { return (DateTime)rentalRow.slutdatum; }
        }

        public bool GetRentalStatus
        {
            get { return (bool)rentalRow.återlämnat; }
        }

        public int GetRentalrowId
        {
            get { return (int)rentalRow.uthyrningsNr; }
        }

        public string GetRentalEquip
        {
            get { return rentalRow.utrustningsID; }
        }

        public int GetRentalSum
        {
            get { return (int)rental.pris; }
        }

        #endregion

        /// <summary>
        /// Metod för att lägga till en ny utrustningsuthyrning för företag
        /// </summary>
        /// <param name="gästNr"></param>
        /// <param name="staffId"></param>
        /// <param name="name"></param>
        /// <param name="address"></param>
        /// <param name="zip"></param>
        /// <param name="city"></param>
        public static void NewRentalCompany(int gästNr, int staffId, string name, string address, string zip, string city, int price)
        {
            LogicSession.TheSession.Db.NewRentalCompany(gästNr, staffId, name, address, zip, city, price);
        }

        /// <summary>
        /// Metod för att lägga till en ny utrustningsuthyrning för privat
        /// </summary>
        /// <param name="staffId"></param>
        /// <param name="name"></param>
        /// <param name="address"></param>
        /// <param name="zip"></param>
        /// <param name="city"></param>
        public static void NewRentalPrivate(int staffId, string name, string address, string zip, string city, int price)
        {
            LogicSession.TheSession.Db.NewRentalPrivate(staffId, name, address, zip, city, price);
        }

        /// <summary>
        /// Metod för att lägga till nya uthyrningsrader
        /// </summary>
        /// <param name="rentalId"></param>
        /// <param name="eqId"></param>
        /// <param name="period"></param>
        /// <param name="price"></param>
        public static void NewRentalRow(int rentalId, string eqId, string period, int price)
        {
            LogicSession.TheSession.Db.NewRentalRow(rentalId, eqId, period, price);
        }
        public static void RentalRowUpdate(int tTempRentalID, int price)
        {
            LogicSession.TheSession.Db.RentalRowUpdate(tTempRentalID, price);
        }
        public static void LinkRentalRowWithInvoice(int tTempRentalID, int price)
        {
            LogicSession.TheSession.Db.LinkRentalRowWithInvoice(tTempRentalID, price);
        }

        /// <summary>
        /// Metod för att lämna tillbaka utrustning
        /// </summary>
        /// <param name="tempNr"></param>
        /// <param name="tempId"></param>
        public static void ReturnedEquip(int tempNr, string tempId)
        {
            LogicSession.TheSession.Db.ReturnedEquip(tempNr, tempId);
        }

        /// <summary>
        /// Returnerar metod som hämtar uthyrningsrader efter ID nummer
        /// </summary>
        /// <param name="tempId"></param>
        /// <returns></returns>
        public IQueryable GetRentalRowsById(int tempId)
        {
            return LogicSession.TheSession.Db.GetRentalRowsById(tempId);
        }

        /// <summary>
        /// Returnerar metod som hämtar senaste uthyrningsnumret
        /// </summary>
        /// <returns></returns>
        public int GetRentalNumber()
        {
            return LogicSession.TheSession.Db.GetRentalNumber();
        }

        /// <summary>
        /// Returnerar metod som hämtar uthyrningar efter namn
        /// </summary>
        /// <param name="tempName"></param>
        /// <returns></returns>
        public IQueryable GetRentalsByName(string tempName)
        {
            return LogicSession.TheSession.Db.GetRentalsByName(tempName);
        }

        /// <summary>
        /// Returnerar metod som hämtar specifik uthyrning på valt ID nummer
        /// </summary>
        /// <param name="rentalID"></param>
        /// <returns></returns>
        public IQueryable EquipLeftToReturn(int rentalID)
        {
            return LogicSession.TheSession.Db.EquipLeftToReturn(rentalID);
        }

        /// <summary>
        /// Returnerar metod som hämtar samtliga resterande (ej återlämnade) uthyrningar
        /// </summary>
        /// <returns></returns>
        public IQueryable EquipIDLeftToReturn()
        {
            return LogicSession.TheSession.Db.EquipIDLeftToReturn();
        }

        /// <summary>
        /// Metod för att hämta namn på den som hyrtutrustningen med hjälp av uthyrningsnummer
        /// </summary>
        /// <param name="rentId"></param>
        /// <returns></returns>
        public List<string> GetRentalRecieptDetails(int rentId)
        {
            List<string> currentReceipt = LogicSession.TheSession.Db.GetRentalReceiptDetails(rentId);
            if (currentReceipt == null)
                return null;
            else return currentReceipt.ToList<string>();
        }

        /// <summary>
        /// Metod för att hämta uthyrningsraderna för den utrustning som skall skrivas på uthyrningskvittot.
        /// </summary>
        /// <param name="rentId"></param>
        /// <returns></returns>
        public List<string> GetRentalRecieptRows(int rentId)
        {
            List<string> rentalRows = LogicSession.TheSession.Db.GetRentalRow(rentId);
            return rentalRows;
        }

        /// <summary>
        /// Metod gör att hämta den utrustning som lämnats tillbaka och visas i återlämningskvittot.
        /// </summary>
        /// <param name="rentId"></param>
        /// <returns></returns>
        public List<string> GetRentalRecieptRowsReturned(int rentId)
        {
            List<string> rentalRows = LogicSession.TheSession.Db.GetRentalRowReturned(rentId);
            return rentalRows;
        }

       /// <summary>
        ///  Metod som kontrollerar om faktura för uthyrning redan finns utifrån gästnummer och utskriftsdatum
       /// </summary>
       /// <param name="guestNr"></param>
       /// <param name="today"></param>
       /// <returns></returns>
        public int InvoiceExistForRentalCheck(int guestNr, DateTime today)
        {
            return LogicSession.TheSession.Db.InvoiceExistForRentalCheck(guestNr, today);
        }
       
        /// <summary>
        ///  Metod som sätter uthyrningsnummer till faktura
        /// </summary>
        /// <param name="guestNr"></param>
        /// <param name="today"></param>
        /// <returns></returns>
        public int GetRentalIDForInvoice(int guestNr, DateTime today)
        {
            return LogicSession.TheSession.Db.GetRentalIDForInvoice(guestNr, today);
        }

        /// <summary>
        ///  Metod som hämtar uthyrningsnummer för att lägga till i samma (hamnar på samma faktura)
        /// </summary>
        /// <param name="guestNr"></param>
        /// <param name="today"></param>
        /// <returns></returns>
        public bool CheckRentalIDForInvoice(int guestNr, DateTime today)
        {
            return LogicSession.TheSession.Db.CheckRentalIDForInvoice(guestNr, today);
        }
    }
}

    

